import axios from 'axios'
import { Toast, Dialog } from 'vant'
import store from '@/store'
import router from '@/router'

// 创建 axios 实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // api base_url
  timeout: 30000 // 请求超时时间
})

// 错误处理
const err = error => {
  if (error.response) {
    Toast.fail('请求失败!')
  }
  return Promise.reject(error)
}

/* 
  request interceptor
  请求拦截
  一般用于注入请求头
  与后端的鉴权配合
*/
service.interceptors.request.use(config => {
  config.headers['User-key'] = store.state.user.userid

  const token = store.state.user.token
  if (token) {
    config.headers['Authorization-User'] = token
  }
  return config
}, err)

/* 
  response interceptor
  响应拦截
  根据业务返回的code进行拦截

  常用:
  200 => 通过
  403 => 鉴权超时, 处理 重新请求token 或者 返回登录页 等操作
  500 => 后端业务错误
*/
service.interceptors.response.use(response => {
  const res = response.data
  if (res.code === 200) {
    return res
  } else if (res.code === 403) {
    Dialog({
      width: '250px',
      title: '登录超时, 请重新进入!',
      confirmButtonColor: '#2A73EC'
    }).then(() => {
      store.commit('user/logout')
      router.push('/404')
    })
    return Promise.reject('鉴权超时!')
  } else {
    Toast.fail(res.msg || '请求失败!')
    return Promise.reject(res.msg)
  }
}, err)

export default service
